package com.xwh.system.service.impl;

import cn.hutool.core.io.FileUtil;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.extra.ftp.Ftp;
import cn.hutool.extra.ssh.JschUtil;
import cn.hutool.extra.ssh.Sftp;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xwh.core.utils.CloseUtil;
import com.xwh.system.entity.SysFile;
import com.xwh.system.mapper.SysFileMapper;
import com.xwh.system.service.SysFileService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

/**
 * @author xwh
 **/
@Service
@RequiredArgsConstructor
public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> implements SysFileService {

    /**
     * 获取文件信息
     *
     * @param file 文件
     * @return SysFile
     */
    @Override
    public SysFile getFileBean(MultipartFile file) {
        // 获取文件名
        String fileName = file.getOriginalFilename();
        // 获取文件后缀
        String prefix = null;
        if (fileName != null) {
            prefix = fileName.substring(fileName.lastIndexOf("."));
        }
        // 获取文件大小
        long size = file.getSize();
        // 获取文件md5值
        InputStream inputStream = null;
        String md5 = "";
        try {
            inputStream = file.getInputStream();
            md5 = DigestUtil.md5Hex(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            CloseUtil.close(inputStream);
        }
        // 封装文件信息
        SysFile sysFile = new SysFile();
        sysFile.setFileName(fileName);
        sysFile.setFileSize(String.valueOf(size));
        sysFile.setFileSuffix(prefix);
        sysFile.setFileMd5(md5);
        return sysFile;
    }

    @Override
    public void ftpUpload(SysFile fileBean, MultipartFile file) throws IOException {
        // TODO 上传文件到ftp
        // 1.获取文件流
        InputStream inputStream = null;
        try {
            inputStream = file.getInputStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        // 2.上传文件
        //匿名登录（无需帐号密码的FTP服务器）
        Ftp ftp = new Ftp("172.0.0.1");
        //进入远程目录11111111111å
        ftp.cd("/opt/upload");
        //上传本地文件
        ftp.upload("/opt/upload", FileUtil.file("e:/test.jpg"));
        //下载远程文件
        ftp.download("/opt/upload", "test.jpg", FileUtil.file("e:/test2.jpg"));

        //关闭连接
        ftp.close();
        // TODO 上传文件到ftp
        // 3.保存文件信息
        save(fileBean);
    }

    @Override
    public void sftpUpload(SysFile fileBean, MultipartFile file) {
        Sftp sftp = JschUtil.createSftp("172.0.0.1", 22, "root", "123456");
        //进入远程目录
        sftp.cd("/opt/upload");
        //上传本地文件
        sftp.put("e:/test.jpg", "/opt/upload");
        //下载远程文件
        sftp.get("/opt/upload/test.jpg", "e:/test2.jpg");
        //关闭连接
        sftp.close();
    }
}
